package week6.ui;

/**
 * 
 * Practicumopgave Programmeren 1
 * @author Rick Clement en Adriaan Dekker
 * @version $Revision: 1.3 $
 */
public abstract class Commando {
    // ------------------ Instantievariabelen ----------------

	private char teken;
    private int aantalPars;
    private String beschrijving;
   
    // ------------------ Constructor ------------------------

    /**
     * 
     * @param teken het teken dat voor dit commando staat
	 * @param aantalPars het aantal parameters van dit commando
	 * @param beschrijving korte beschrijving van parameters en commando
	 * @require 0 <= aantalPars <= 2 && beschrijving != null
	 * @ensure this.getTeken() == teken && this.getBeschrijving() == beschrijving && this.getAantalPars() == aantalPars
     */
	 
    protected Commando(char teken, int aantalPars, String beschrijving) {
		this.teken = teken;
		this.aantalPars = aantalPars;
		this.beschrijving = beschrijving;
	}
	
    // ------------------ Aanvragen --------------------------

	/**
	 * Levert een tekstuele representatie van dit <code>Commando</code>.
	 * @return een tekstuele representatie van dit <code>Commando</code>.
	 */
	public String toString() {
		return " " + teken + "(" + aantalPars + ") : " + beschrijving;
	}
	
	/**
     * Levert het aantal parameters dat dit commando verwacht. Hier is gekozen voor een parametertal tussen de 0 en 2.
	 * @ensure 0 <= result <= 2
	 * @return aantal parameters dat dit commando verwacht
     */
    
	public int getAantalPars() {
		return aantalPars;
	}
    
	/**
     * Geeft aan of een gegeven combinatie van teken en parameters een geldige aanroep van dit commando vormt. 
	 * Als het teken wel klopt maar het aantal parameters niet dan wordt een foutboodschap geprint.
     * @param teken het teken van het uit te voeren commando
	 * @param par1 de eerste parameter van de aanroep, of null
	 * @param par2 de tweede parameter van de aanroep, of null
	 * @return true als teken samen met par1 en par2 een geldige aanroep van dit commando vormen
	 * @require als par1 == null dan par2 == null
	 * @ensure result == (teken == this.getTeken()) && ( getAantalPars() == 0 && par1 == null || getAantalPars() == 1 && par1 != null && par2 == null || getAantalPars() == 2 && par2 != null)
     */
    
	public boolean kanUitvoeren(char teken, String par1, String par2) {
		boolean retval = teken == this.teken
			&& (
				this.aantalPars == 0
					|| (this.aantalPars == 1 && par1 != null)
					|| (this.aantalPars == 2 && par1 != null && par2 != null)
			);
		return retval;
	}
	
	/**
	 * Levert het karakteristieke teken van dit commando. 
	 * Dit dient kenmerkend te zijn voor het commando; d.w.z., twee verschillende commando's moeten niet hetzelfde teken hebben.
	 */
	 
	public char getTeken(){
		return teken;
	}
	
	/**
	* Korte beschrijving van parameters en commando. De beschrijving dient te bestaan uit een enkele regel, waarop aantal en aard van de benodigde parameters worden uitgelegd, en de bedoeling van het commando wordt beschreven.
	* @return beschrijving van het commando
	* @ensure result != null
	*/
	
	public String getBeschrijving() {
		return beschrijving;
	}
	
    // ------------------ Commando's --------------------------

    /**
     * Voert dit commando uit, met gegeven parameters.
     * @param par1 de eerste parameter van de methode, of null
	 * @param par2 de tweede parameter van de methode, of null
	 * @require this.kanUitvoeren(this.teken(), par1, par2)
     */
	 
	public abstract void voerUit(String par1, String par2);
}
